#ifndef _IDibujable_h
#define _IDibujable_h
#include <iostream>
#include "Coordenada.h"
#include "ExcepcionSVG.h"
using namespace std;

/** \file IDibujable.h
* \brief Clase IDibujable
*
* Defincion de clase IDibujable.
* JAVIER ANTON DIAZ DNI:48629698Q
* STANISLAV LITVINENKO DNI:02062226T
*/


/** \brief Clase virtual IDibujable.
 *
 * Clase que define los métodos y funciones asociados a esta.
 */
class IDibujable
{

	public:
		/** \brief Destructor virtual puro de objetos IDibujable.
		*
		* Se ejecuta cuando hace falta destruir un objeto.
		*/
		virtual ~IDibujable()=0;

		/** \brief mover().
		*
		* Este metodo desplaza el porigen de una figura a otra coordenada devolviendo la coordenada antigua.
		*
		* \param porigen El nuevo origen al que desplazar
		* \return El método devuelve la Coordenada antigua
		*/
		virtual Coordenada mover(const Coordenada& porigen) = 0;

		/** \brief getOrigen.
		*
		* Este método devuelve el valor del atributo centro de la clase IDibujable virtual.
		*
		* \return El método devuelve un objeto Coordenada.
		*/
		virtual Coordenada getOrigen() const = 0;

		/** \brief pintar.
		*
		* Este método recibe un parámetro os tipo ostream mediante el cual efectúa la salida en el formato que queremos.
		* \param os tipo ostream&.
		* \return El método no devuelve nada.
		*/
		virtual void pintar(ostream& os) const = 0;

		/** \brief puedoPintarme().
		*
		* Este metodo comprueba que la figura no pertenezca a ningun grupo y devuelve si es cierto o falso.
		* \return El método no devuelve nada.
		*/
		virtual bool puedoPintarme() const = 0;

		/** \brief leeEntrada().
		*
		* Este método procesa la linea del fichero para rellenar los datos de un grupo de figuras.
		* \param is flujo de entrada.
		* \return El método no devuelve nada.
		*/
		virtual void leeEntrada(istream& is) = 0;

		/** \brief clonar().
		*
		* Este método crea una figura virtual IDibujable clonica al original.
		* \return El método devuelve un puntero a ese objeto clonico.
		*/
		virtual IDibujable* clonar() const = 0;

		/** \brief escalar().
		*
		* Este método eleva todos los valores alterables de la figura.
		* \param porcentaje cuanto debe de ser elevado el radio.
		* \return El método no devuelve nada.
		*/
		virtual void escalar(float porcentaje=100.0) = 0;

		/** \brief duplicar().
		*
		* Este método duplicar la figura con la Coordenada que recibe.
		* \param coor Coordenada de la figura duplicada
		* \return El método devuelve un puntero a la figura duplicada.
		*/
		virtual IDibujable* duplicar(const Coordenada& coor) = 0;
	private:
};



#endif
